package org.cybzacg.convert.enums;

/**
 * 拷贝模式枚举
 * 定义属性拷贝的不同策略和行为
 * 
 * @author PropertyCopier Implementation
 * @version 1.0.0
 */
public enum CopyMode {
    /**
     * 浅拷贝模式
     * 只拷贝对象的基本类型字段，引用类型字段直接复制引用
     * 适用于性能要求高且不需要深层次拷贝的场景
     */
    SHALLOW("shallow", "浅拷贝，只拷贝对象引用"),
    
    /**
     * 深拷贝模式
     * 递归拷贝所有字段，包括引用类型的深层对象
     * 适用于需要完全独立副本的场景
     */
    DEEP("deep", "深拷贝，递归拷贝所有属性"),
    
    /**
     * 引用拷贝模式
     * 直接复制对象的引用，不创建任何新对象
     * 适用于只需要引用传递的场景
     */
    REFERENCE("reference", "引用拷贝，直接复制引用"),
    
    /**
     * 克隆拷贝模式
     * 使用对象的clone方法进行拷贝
     * 要求目标对象实现Cloneable接口
     */
    CLONE("clone", "克隆拷贝，使用对象的clone方法");

    private final String code;
    private final String description;

    CopyMode(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 获取模式代码
     * 
     * @return 模式代码
     */
    public String getCode() {
        return code;
    }

    /**
     * 获取模式描述
     * 
     * @return 模式描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 根据代码获取拷贝模式
     * 
     * @param code 模式代码
     * @return 对应的拷贝模式，如果未找到则返回SHALLOW
     */
    public static CopyMode fromCode(String code) {
        if (code == null) {
            return SHALLOW;
        }
        
        for (CopyMode mode : values()) {
            if (mode.code.equalsIgnoreCase(code.trim())) {
                return mode;
            }
        }
        
        return SHALLOW;
    }

    /**
     * 验证拷贝模式是否有效
     * 
     * @param mode 要验证的模式
     * @return 如果模式有效则返回true
     */
    public static boolean isValid(CopyMode mode) {
        return mode != null;
    }

    /**
     * 检查是否需要创建新对象
     * 
     * @return 如果需要创建新对象则返回true
     */
    public boolean requiresNewInstance() {
        return this != REFERENCE;
    }

    /**
     * 检查是否需要递归处理
     * 
     * @return 如果需要递归处理则返回true
     */
    public boolean requiresRecursion() {
        return this == DEEP;
    }

    /**
     * 检查是否需要目标对象实现Cloneable
     * 
     * @return 如果需要Cloneable接口则返回true
     */
    public boolean requiresCloneable() {
        return this == CLONE;
    }

    @Override
    public String toString() {
        return String.format("%s (%s)", description, code);
    }
}
